www.gusucode.com > VC++ 系统进程管理器源码-源码程序 > VC++ 系统进程管理器源码-源码程序/code/Src_EvilSword/KernelEnum.cpp

    //Download by http://www.NewXing.com
// KernelEnum.cpp : implementation file
//

#include "stdafx.h"
#include "EvilSword.h"
#include "KernelEnum.h"
#include <Psapi.h>
#include "resource.h"
#pragma comment ( lib, "psapi.lib" )
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CKernelEnum dialog


CKernelEnum::CKernelEnum(CWnd* pParent /*=NULL*/)
	: CDialog(CKernelEnum::IDD, pParent)
{
	//{{AFX_DATA_INIT(CKernelEnum)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CKernelEnum::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CKernelEnum)
	DDX_Control(pDX, IDC_LIST1, m_kernel);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CKernelEnum, CDialog)
	//{{AFX_MSG_MAP(CKernelEnum)
	ON_WM_SHOWWINDOW()
	ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclickList1)
	ON_COMMAND(ID_UPDATE, OnUpdate)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKernelEnum message handlers

BOOL CKernelEnum::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
    m_kernel.InsertColumn(0,"驱动名");
    m_kernel.InsertColumn(1,"基地址");
    m_kernel.InsertColumn(2,"驱动路径");
    
    //设置样式让其有表格
    m_kernel.SetExtendedStyle(m_kernel.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);


	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CKernelEnum::ListKernelModules()
{
    //接收返回的内核驱动的基地址
    LPVOID pImageBase[400];
    //接收返回的字节数
    DWORD nReturn=0;
    //枚举设备驱动
    BOOL isSuccess=EnumDeviceDrivers(pImageBase,sizeof(pImageBase),&nReturn);
    if (isSuccess==0)
    {
        AfxMessageBox(TEXT("驱动枚举失败"));
        return;
    }
    //格式化驱动加载基址
    CString szText;
    //筛选不合格的地址
    static int nNum=0;
    //nReturn/sizeof(LPVOID)为驱动枚举的个数
    for (UINT i=0;i<((nReturn)/sizeof(LPVOID));i++)
    {
        //筛选内核地址
        if (pImageBase[i]<(LPVOID)0x80000000)
        {
            
            nNum++;
            continue;
        }
        //接收驱动名
        char szDriverName[100];
        //接收路径 最大为260
        char szDriverFilePath[MAX_PATH];
        //得到驱动名
        GetDeviceDriverBaseName(pImageBase[i],szDriverName,100);

        m_kernel.InsertItem(i,szDriverName);
        //基地址
        szText.Format("0x%08X",pImageBase[i]);
        m_kernel.SetItemText(i,1,szText);
        //得到驱动的路径
        GetDeviceDriverFileName(pImageBase[i],szDriverFilePath,MAX_PATH);
        m_kernel.SetItemText(i,2,szDriverFilePath);
    }
    
    szText.Format("当前驱动数为: %d",(nReturn)/sizeof(LPVOID)-nNum);
    nNum=0;
    //显示进程数
    ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,STATIC_TISHI,szText);
    


}

void CKernelEnum::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	
	// TODO: Add your message handler code here
    //删除全部的项目 起到刷新的作用
    m_kernel.DeleteAllItems();
    if (bShow==TRUE)
    {
        //枚举内核模块
        ListKernelModules();
        //宽度对齐等
        m_kernel.SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER);
        m_kernel.SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER);
        m_kernel.SetColumnWidth(2,LVSCW_AUTOSIZE_USEHEADER);

    }

	
}



void CKernelEnum::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
    POINT pt;
    //获取鼠标光标的位置
    GetCursorPos(&pt);
    
    CMenu menu;
    //加载菜单资源 
    menu.LoadMenu(CG_IDR_POPUP_KERNEL_ENUM);
    //弹出
    menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this);


	
	*pResult = 0;
}

void CKernelEnum::OnUpdate() 
{
	// TODO: Add your command handler code here
   m_kernel.DeleteAllItems();
   ListKernelModules();
   //宽度对齐等
   m_kernel.SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER);
   m_kernel.SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER);
   m_kernel.SetColumnWidth(2,LVSCW_AUTOSIZE_USEHEADER);
	
}